package com.example.beauty.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.example.beauty.entity.User;
import com.example.beauty.mapper.UserMapper;
import com.example.beauty.resp.RespCode;
import com.example.beauty.resp.RespModel;
import com.example.beauty.service.UserService;
import com.example.beauty.utils.HttpClientUtil;
import com.example.beauty.utils.StringCheckUtil;
import com.example.beauty.vo.LoginData;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author qin
 * @create 2022--09--13--16:20
 * 步骤：
 * 1.校验用户输入（非空）
 * 2.校验是否已经注册
 * 3.密码加密
 * 4.插入数据库
 */
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;

    @Override
    public RespModel register(User user) {
        try {
            // 第一步：校验用户输入
            String username = user.getUsername();
            String phone = user.getPhone();
            String password = user.getPassword();

            if (StringCheckUtil.isEmpty(username)) {
                return new RespModel(RespCode.Error_1, null);
            }
            if (StringCheckUtil.isEmpty(phone)) {
                return new RespModel(RespCode.Error_2, null);
            }
            if (!StringCheckUtil.isMobile(phone)) {
                return new RespModel(RespCode.Error_3, null);
            }
            if (StringCheckUtil.isEmpty(password)) {
                return new RespModel(RespCode.Error_4, null);
            }
            // 第二步：校验是否已经注册  根据手机号码查询
            List<User> users = userMapper.getByPhone(phone);
            if (users.size() > 0) { // 已经有账号
                return new RespModel(RespCode.Error_5, null);
            }
            //第三步：密码加密   原密码   盐值   加密次数
            Md5Hash md5Hash = new Md5Hash(password, "qianfeng", 10);
            String _password = md5Hash.toString();
            user.setPassword(_password);
            // 第四步：存入数据库
            userMapper.insert(user);
            return new RespModel(RespCode.SUCCESS_1, user);
        } catch (Exception e) {
            e.printStackTrace();
            return new RespModel(RespCode.FAIL, null);
        }
    }

    @Override
    public RespModel login(LoginData loginData) {
        try {
            // 第一步,校验用户输入
            String phone = loginData.getPhone();
            String password = loginData.getPassword();
            if (StringCheckUtil.isEmpty(phone)) {
                return new RespModel(RespCode.Error_2, null);
            }
            if (!StringCheckUtil.isMobile(phone)) {
                return new RespModel(RespCode.Error_3, null);
            }
            if (StringCheckUtil.isEmpty(password)) {
                return new RespModel(RespCode.Error_4, null);
            }
            // 第二步，根据手机号查询用户
            List<User> users = userMapper.getByPhone(phone);
            if (users.size() == 0) {
                return new RespModel(RespCode.Error_6, null);
            }
            if (users.size() > 1) {
                return new RespModel(RespCode.Error_7, null);
            }
            // 当users.size() == 1，获取到user
            User user = users.get(0);
            // 第三步，校验密码
            Md5Hash md5Hash = new Md5Hash(password, "qianfeng", 10);
            if (!user.getPassword().equals(md5Hash.toString())) {
                return new RespModel(RespCode.Error_8, null);
            }
            // 第四步，调用微信接口，获取session_key和openid
            /**
             * appid:微信appid
             * secret：密钥
             */
            String url = "https://api.weixin.qq.com/sns/jscode2session?appid=wx978f10b8672a6922&secret=9989487c1ba14a542726ca49079cd812&js_code=" + loginData.getCode() + "&grant_type=authorization_code";
            String result = HttpClientUtil.doGet(url);
//        {"session_key":"Dlem2AuDKcRsYw4xyIC0tg==","openid":"o5Cvs6mh4oOE7osBuHTzw5vaEOCQ"}
            // 返回的其实是一个String类型的json数据
            System.out.println("发送请求到微信平台接口：" + result);
            // 将数据转换成json格式
            JSONObject jsonResult = (JSONObject) JSONObject.parse(result);

            String session_key = (String) jsonResult.get("session_key");
            String openid = (String) jsonResult.get("openid");
            // 第五步，自定义token
            String token = new Md5Hash(session_key, openid, 10).toString();
            // 第六步，存储session_key，openid，token
            user.setOpenId(openid);
            user.setSessionKey(session_key);
            user.setToken(token);

            userMapper.update(user);

            return new RespModel(RespCode.SUCCESS_2,user);
        }catch (Exception e){
            e.printStackTrace();
            return new RespModel(RespCode.FAIL,null);
        }
    }


}
